package cn.tedu.suppermemory.service.impl;

import cn.tedu.suppermemory.ex.ServiceException;
import cn.tedu.suppermemory.mapper.RoleMapper;
import cn.tedu.suppermemory.mapper.UserMapper;
import cn.tedu.suppermemory.mapper.UserRoleMapper;
import cn.tedu.suppermemory.pojo.dto.UserRoleAddNewDTO;
import cn.tedu.suppermemory.pojo.entity.UserRole;
import cn.tedu.suppermemory.pojo.vo.RoleStandardVO;
import cn.tedu.suppermemory.pojo.vo.UserRoleListItemVO;
import cn.tedu.suppermemory.pojo.vo.UserRoleStandardVO;
import cn.tedu.suppermemory.pojo.vo.UserStandardVO;
import cn.tedu.suppermemory.service.IUserRoleService;
import cn.tedu.suppermemory.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class UserRoleServiceImpl implements IUserRoleService {

    @Autowired
    private IUserRoleService userRoleService;
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;

    /**
     * 添加用户角色
     *
     * @param userRoleAddNewDTO 用户角色数据
     */
    @Override
    public void addNew(UserRoleAddNewDTO userRoleAddNewDTO) {

        log.debug("开始处理【添加用户角色】的业务，参数：{}", userRoleAddNewDTO);

        // 检查该用户id在用户表中是否存在 不存在，抛出异常
        Long userId = userRoleAddNewDTO.getUserId();
        UserStandardVO userStandardById = userMapper.getStandardById(userId);
        if (userStandardById == null) {
            // 不存在该用户id，抛出异常
            String message = "该用户id在用户表中不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 检查权限表中是否存在该角色 不存在，抛出异常
        Long roleId = userRoleAddNewDTO.getRoleId();
        RoleStandardVO roleStandardById = roleMapper.getStandardById(roleId);
        if (roleStandardById == null) {
            // 不存在该角色id，抛出异常
            String message = "该角色id在角色表中不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 检查该用户在用户角色表中是否存在
        // 若存在该用户id， 还需查询该角色id的权限id是否已存在，若存在该角色id的权限id，抛出异常  没有该角色id的权限id，则可以添加
        // 若不存在该角色id，则可以直接添加
        int countByUserId = userRoleMapper.countByUserId(userId);
        if (countByUserId >=1 ) {
            // 对该用户id的角色id进行查询
            int countByUserIdAndRoleId = userRoleMapper.countByUserIdAndRoleId(userId, roleId);
            if (countByUserIdAndRoleId >= 1) {
                String message = "该角色id中已存在该权限id！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建userRole对象
        UserRole userRole = new UserRole();
        BeanUtils.copyProperties(userRoleAddNewDTO,userRole);
        log.info("即将进行数据插入！");
        int insert = userRoleMapper.insert(userRole);
        if (insert == 0) {
            String message = "添加数据失败，服务器忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    /**
     * 删除用户角色
     *
     * @param id 用户角色id
     */
    @Override
    public void delete(Long id) {
        log.info("开始处理【根据id删除用户角色数据】的业务，参数：{}", id);
        // 检查尝试删除的数据是否存在
        UserRoleStandardVO standardById = userRoleMapper.getStandardById(id);
        if (standardById == null) {
            String message = " 删除用户角色数据失败，尝试访问的数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        log.info("开始执行删除数据：参数：id={}", id);
        int rows = userRoleMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除数据失败！服务器忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    /**
     * 查询用户角色列表数据
     *
     * @return List<userRoleListItemVO> 用户角色列表
     */
    @Override
    public List<UserRoleListItemVO> list() {
        log.info("开始处理【查询用户角色】的业务，无参数！");
        List<UserRoleListItemVO> list = userRoleMapper.list();

        for (UserRoleListItemVO item : list) {
            log.info("增强型for循环：查询结果：【{}】", item);
        }

        return list;
    }
}
